perm filename XLITER.FAI[XGP,BGB] blob sn#029409 filedate 1973-05-11 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE XLIT - TRANSLITERATE TEXT
C00007 00003	XLITER FILE READ, DO XLITERATION.
C00013 00004	NSUBR(GETCHR)INPUT A CHARACTER
C00015 00005	NSUBR(GETFIL)GET FILE SPEC FROM TTY LINE 
C00017 00006	NSUBR(SEARCH,KEY,TABLE,SIZE)SEARCH HASH TABLE
C00018 00007	DATA AREA
C00019 ENDMK
C⊗;
TITLE XLIT - TRANSLITERATE TEXT
	ACCUMULATORS{CHR,PTR,CNT,T1,T2,LAST,ACCUM,FOO}

	↓INCHAN←14
	↓OUTCHAN←15

	XLTSIZ←=503	;NICE PRIME(?) NUMBER

START:	MOVE P,[IOWD PLEN,PDL]
	OUTSTR[ASCIZ/
TRANSLITERATION FILE: /]
	CALL(GETFIL)
	CALLI 12
	INIT INCHAN,
	SIXBIT/DSK/
	INHDR
	FATAL(CAN'T INIT DSK)
	LOOKUP INCHAN,FILNAM
	GO [ SKIPE EXTION
	     GO XLTNFD
	     MOVSI 1,'XLT'
	     MOVEM 1,EXTION
	     LOOKUP INCHAN,FILNAM
	     GO [XLTNFD: OUTSTR[ASCIZ/FILE NOT FOUND./]
			 GO START]
	     GO XLTOK]
XLTOK:	SETZM XLTABLE
	MOVE [XWD XLTABLE,XLTABLE+1]
	BLT XLTEND
	SETZM XLTFNT
	MOVEI 1
	MOVEM ESCFNT
L0:	MOVEI READY
	MOVEM INEOF
	CALL(TVTEST)
	CALL(GETCHR)
;	CAIN CHR,"C"
;	GO [ CALL(GETCHR)
;	     CAIN CHR,"O"
;	     GO [ MOVEI [FATAL(NULL FILE)]
;		  MOVEM INEOF
;		  CALL(GETCHR)
;		  CAIE CHR,14
;		  GO $.-2
;		  GO L0 ]
;	     MOVEM CHR,ESC2
;	     MOVEI CHR,"C"
;	     MOVEM CHR,ESC1
;	     GO L0A ]
	MOVEM CHR,ESC1
	CALL(GETCHR)
	MOVEM CHR,ESC2
	CALL(GETCHR)
	MOVEM CHR,ESC3
	CALL(GETCHR)
	MOVEM CHR,ESC4
	CALL(GETCHR)
	CAIE CHR,15
L0A:	GO [ FATAL(ESCAPE CHARACTERS ARE FOUR SINGLE CHARACTERS FOLLOWED BY
CRLF.  SEE XLITER.DOC FOR DETAILS) ]
	CALL(GETCHR)
	CAIE CHR,12
	GO L0A
L1A:	CALL(GETCHR)
L1:	MOVEI CNT,5
	SETZM FROMLIT
	MOVE T1,[POINT 7,FROMLIT]
	MOVEM T1,FROMPTR#
L2:	JUMPE CHR,[CALL(GETCHR)↔GO L2]
	IDPB CHR,FROMPTR
	CALL(GETCHR)
	CAIN CHR,"≡"
	GO [ CALL(GETCHR)
	     GO L2A ]
	CAIN CHR,"→"
	GO L3A
L2A:	SOJG CNT,L2
	FATAL(TRANSLITERATION LONGER THAN 5 CHARACTERS)
L3A:	CALL(GETCHR)
L3:	MOVEI CNT,5
	SETZM TOLIT
	MOVE PTR,[POINT 7,TOLIT]
L4:	CAIN CHR,"≡"
	GO [ CALL(GETCHR)
	     GO L4A ]
	CAIN CHR,15
	CALL(GETCHR)
	CAIN CHR,12
	GO L5
	JUMPE CHR,L4
L4A:	IDPB CHR,PTR
	CALL(GETCHR)
	SOJG CNT,L4
	FATAL(TRANSLITERATION LONGER THAN 5 CHARACTERS)
L5:	CALL(SEARCH,FROMLIT,[XLTABLE],[XLTSIZ])
	GO L6			;FAILURE
	SKIPE XLTVAL(1)
	GO [ MOVE T1,TOLIT
	     CAMN T1,XLTVAL(1)
	     GO [ OUTSTR[ASCIZ/DUPLICATE DECLARATION '/]
		  OUTSTR FROMLIT
		  OUTSTR[ASCIZ/'→'/]
		  OUTSTR TOLIT
		  OUTSTR[ASCIZ/'
/]↔		  GO L1A]
	     OUTSTR[ASCIZ/ATTEMPT TO REDEFINE '/]
	     OUTSTR FROMLIT
	     OUTSTR[ASCIZ/'→'/]
	     OUTSTR XLTVAL(1)
	     OUTSTR[ASCIZ/' AS '/]
	     OUTSTR TOLIT
	     OUTSTR[ASCIZ/'
/]↔	     GO L1A]
L6:	MOVE T1,FROMLIT
	MOVEM T1,XLTABLE(1)
	MOVE T1,TOLIT
	MOVEM T1,XLTVAL(1)
	SETZB T1,TOLIT
	DPB T1,FROMPTR
	MOVSI PTR,(<7B5>)
	ADDB PTR,FROMPTR
	CAMN PTR,[POINT 7,FROMLIT]
	GO L1A
	CALL(SEARCH,FROMLIT,[XLTABLE],[XLTSIZ])
	GO L6
	GO L1A
;XLITER FILE READ, DO XLITERATION.
READY:	OUTSTR[ASCIZ/
INPUT FILE: /]
	CALL(GETFIL)
	GO .-2
	LOOKUP INCHAN,FILNAM
	GO [	OUTSTR[ASCIZ/FILE NOT FOUND./]
		GO READY]
READY2:	OUTSTR[ASCIZ/OUTPUT FILE: /]
	CALL(GETFIL)
	GO .-2
	INIT OUTCHAN,
	SIXBIT/DSK/
	XWD OUTHDR,0
	FATAL(CAN'T INIT DSK)
	ENTER OUTCHAN,FILNAM
	GO [	OUTSTR[ASCIZ/FILE IN USE OR PROTECTED.
/]↔		GO READY2]
	SETZM CURFNT
	MOVEI FINISH
	MOVEM INEOF
	CALL(TVTEST)
R1A:	CALL(GETCHR)
R1:	JUMPE CHR,R1A
	CAMN CHR,ESC1
	GO [ CALL(SELFNT,ESCFNT)
	     SETZM ACCUM
	X1:  CALL(GETCHR)
	     JUMPE CHR,$.-1
	     CAMN CHR,ESC3
	     GO [ CALL(GETCHR)
		  GO X2 ]
	     CAMN CHR,ESC2
	     GO R1A
	     CAMN CHR,ESC4
	     GO [ CALL(GETCHR)
		  CAIL CHR,"0"
		  CAILE CHR,"9"
		  GO [ OUTSTR[ASCIZ/ILLEGAL FONT NUMBER: '/]
		       OUTCHR CHR
		       OUTSTR[ASCIZ/'
/]↔		       GO R1A ]
		  SUBI CHR,"0"
		  MOVEM CHR,ESCFNT
		  GO X1 ]
	X2:  CALL(PUTCHR,CHR)
	     GO X1 ]
	CAMN CHR,ESC3
	GO [ CALL(GETCHR)
	     CALL(SELFNT,ESCFNT)
	     CALL(PUTCHR,CHR)
	     GO R1A ]
	CAMN CHR,ESC4
	GO [ CALL(GETCHR)
	     CAIL CHR,"0"
	     CAILE CHR,"9"
	     GO [ OUTSTR[ASCIZ/ILLEGAL FONT NUMBER: '/]
		  OUTCHR CHR
		  OUTSTR[ASCIZ/'
/]↔		  GO R1A ]
	     SUBI CHR,"0"
	     MOVEM CHR,XLTFNT
	     GO R1A ]
	CAIE CHR,12
	CAIN CHR,15
	GO [ SPCHAR: CALL(PUTCHR,CHR)
		     GO R1A]
	CAIE CHR,11
	CAIN CHR,40
	GO SPCHAR
	CAIN CHR,14
	GO SPCHAR
	MOVEI CNT,5
	MOVE PTR,[POINT 7,ACCUM]
	SETZ ACCUM,
	SETO LAST,
R2:	JUMPE CHR,[CALL(GETCHR)↔GO R2]
	IDPB CHR,PTR
	CALL(SEARCH,ACCUM,[XLTABLE],[XLTSIZ])
	GO FAIL
	MOVE LAST,1
	CALL(GETCHR)
	SOJG CNT,R2
FAIL:	JUMPL LAST,[SETZ CHR,↔GO FAIL3]
	SKIPE XLTVAL(LAST)
	GO [ PUSHJ P,OUTWORD
	     GO R1]
FAIL2:	OUTSTR[ASCIZ/UNDEFINED LETTER(S) '/]
	SETZ FOO,
	DPB FOO,PTR
FAIL3:	SKIPN ACCUM
	FATAL(INTERNAL CONFUSION)
	OUTSTR[ASCIZ/'/]
	OUTSTR ACCUM
	OUTSTR[ASCIZ/' WILL BE DEFINED AS SAME.
/]
	SKIPE XLTABLE(1)
	FATAL(OVERWRITE CHECK FOR HASH TABLE)
	SKIPE XLTVAL(1)
	FATAL(OVERWRITE CHECK FOR HASH TABLE)
	MOVEI T1,XLTSIZ-1
S1:	CAMN ACCUM,XLTVAL(T1)
	GO [ OUTSTR[ASCIZ/	'/]
	     OUTSTR XLTABL(T1)
	     OUTSTR[ASCIZ/' IS A ALREADY DEFINED AS '/]
	     OUTSTR XLTVAL(T1)
	     OUTSTR[ASCIZ/'
/]
	     GO S1+2]
	SOJGE T1,S1
	MOVEM ACCUM,XLTABLE(1)
	SETOM ACCUM,XLTVAL(1)
	MOVE LAST,1
	PUSHJ P,OUTWORD
	GO R1

FINISH:	SKIPE ACCUM
	PUSHJ P,OUTWORD
FIN2:	RELEAS INCHAN,
	RELEAS OUTCHAN,
	CALLI
	MOVE JOBFF
	CORE
	FATAL(CAN'T SHRINK CORE)
	OUTSTR[ASCIZ/
FINISHED!
USE FONT#0 FOR TRANSLITERATED CHARACTERS.
USE FONT#1 FOR NORMAL CHARACTERS./]
	CALLI 12

OUTWORD: MOVEI CNT,5
	MOVE PTR,[POINT 7,XLTVAL(LAST)]
	MOVE T1,XLTVAL(LAST)
	CAMN T1,[-1]
	GO [ MOVE PTR,[POINT 7,XLTABL(LAST)]
	     CALL(SELFNT,ESCFNT)
	     CALL(OUTWO1)
	     POPJ P, ]
	CALL(SELFNT,XLTFNT)
OUTWO1:	ILDB T1,PTR
	JUMPE T1,CPOPJ
	CALL(PUTCHR,T1)
	SOJG CNT,OUTWO1
CPOPJ:	POPJ P,

	LOC 124
	GO REEADR
	RELOC
REEADR:	MOVEI 1,XLTSIZ
REEL1:	SOJL 1,[CALLI 1,12]
	SKIPN XLTABL(1)
	GO REEL1
	OUTSTR XLTABL(1)
	SKIPN T1,XLTVAL(1)
	GO [ OUTSTR[ASCIZ/ intermediate	/]
	     GO REEL1 ]
	CAMN T1,[-1]
	GO [ OUTSTR[ASCIZ/ is undefined	/]
	     GO REEL1 ]
	OUTSTR[ASCIZ/→/]
	OUTSTR XLTVAL(1)
	OUTSTR[ASCIZ/	/]
	GO REEL1
NSUBR(GETCHR)INPUT A CHARACTER
	GLOBAL CHR
	SOSG INCNT
	IN INCHAN,
	GO[ ILDB CHR,INPTR↔ POP0J]
	STATZ INCHAN,IODEND	
	GO @INEOF
	FATAL(READ ERROR)
SUBREND GETCHR
NSUBR(PUTCHR,CHAR)OUTPUT A CHARACTER
	SOSG OUTCNT
	OUT OUTCHAN,
	GO[ EXCH 1,CHAR↔ IDPB 1,OUTPTR↔ EXCH 1,CHAR↔ POP1J]
	FATAL(WRITE ERROR)
SUBREND PUTCHR
NSUBR(SELFNT,FNTNUM)
	GLOBAL CHR;
	EXCH 1,FNTNUM
	CAMN 1,CURFNT
	GO FNTOK
	CALL(PUTCHR,[177])
	CALL(PUTCHR,[1])
	CALL(PUTCHR,1)
	MOVEM 1,CURFNT
FNTOK:	EXCH 1,FNTNUM
	POP1J
SUBREND SELFNT
NSUBR TVTEST
	GLOBAL CHR
	IN INCHAN,	;READ FIRST RECORD
	SKIPA
	FATAL (READ ERROR)
	HRRZ 2,INPTR
	ADD 2,[XWD 1,1]
	MOVSI 1,-4	;LOOK AT FIRST 4 WORDS
LOOP:	MOVE 0,@2
	CAME 0,TVSAMP(1)
	POP0J
	AOBJN 1,LOOP
TVFILE:	PUSH P,INEOF
	MOVEI TVLOSE
	MOVEM INEOF
	CALL(GETCHR)
	CAIE CHR,14
	GO .-2
	POP P,INEOF
	OUTSTR [ASCIZ/I assumed file was in TVED format.
/]
	POP0J
TVSAMP:	ASCII/COMMENT ⊗   VALID 00007 PAGES/
;	      123456789012345678901234567890
;		       1         2         3
;		  0    1    2    3    4    5
TVLOSE:	FATAL (EOF IN TVED DIRECTORY)
SUBREND TVTEST
NSUBR(GETFIL)GET FILE SPEC FROM TTY LINE 

	SETZM FILNAM↔SETZM EXTION
	SETZM EXTION+1↔SETZM PPPN
;	CRLF
	MOVE 4,[POINT 6,FILNAM,-1]↔MOVEI 2,6
	INCHWL 1↔CAIN 1,15↔GO[INCHWL↔POP0J]↔AOS(P)
	JRST L+1
L:	INCHWL 1
	CAILE 1,"z"↔POP0J
	CAIL 1,"a"↔SUBI 1,40		;CONVERT LOWER CASE
	CAIN 1,"."↔GO[MOVE 4,[POINT 6,EXTION,-1]↔MOVEI 2,3↔GO L]
	CAIN 1,"["↔GO[MOVE 4,[POINT 6,PPPN,-1]  ↔MOVEI 2,3↔GO L]
	CAIN 1,","↔GO[HLRZ PPPN
		      PUSHJ P,[PPJUST:	JUMPE [OUTSTR[ASCIZ/BAD P,PN/]
						CLRBFI↔SOS -1(P)↔CRLF↔POP1J]	
		   	 		TRNE 77↔POP0J↔LSH -6↔GO PPJUST]
		      HRLM PPPN↔MOVE 4,[POINT 6,PPPN,17]↔MOVEI 2,3↔GO L]
	CAIN 1,"]"↔GO[HRRZ PPPN↔CALL(PPJUST)
		   HRRM PPPN↔INCHWL 1↔GO FINQ]
FINQ:	CAIN 1,15↔GO EOL			;END OF THE LINE.
	CAIN 1,12↔POP0J
	CAIN 1,"→"↔POP0J
	CAIG 1," "↔GO L	;IGNORE GARBAGE.
	SOJL 2,L↔SUBI 1,40↔IDPB 1,4↔GO L

EOL:	INCHWL 1↔POP0J
SUBREND;1/31/73(BGB),2/7/73(TVR)
NSUBR(SEARCH,KEY,TABLE,SIZE)SEARCH HASH TABLE
	GLOBAL ACCUM,T1,T2,FOO
	HRLI FOO,T2
	HRR FOO,TABLE
	MOVE ACCUM,KEY
	MOVM T1,ACCUM
	IDIV T1,SIZE
	SETZM LOSE#
L2:	CAMN ACCUM,@FOO
	GO [ MOVE 1,T2↔ AOS(P)↔ POP3J]
	SKIPE T1,@FOO
	SOJGE T2,L2
	JUMPE T1,[MOVE 1,T2↔ POP3J]
	SKIPE LOSE
	FATAL(HASH TABLE FULL)
	SETOM LOSE
	MOVE T2,SIZE
	SOJA T2,L2
SUBREND
;DATA AREA
FROMLI:	BLOCK 2
TOLIT:	BLOCK 2
ESC1:	0
ESC2:	0
ESC3:	0
ESC4:	0
CURFNT:	0
XLTFNT:	0
ESCFNT:	0

INHDR:	0
INPTR:	0
INCNT:	0
INEOF:	HALT .

OUTHDR: 0
OUTPTR: 0
OUTCNT: 0

FILNAM: 0
EXTION: 0
	0
PPPN:	0

XLTABL: BLOCK XLTSIZ
XLTVAL: BLOCK XLTSIZ
XLTEND←←.-1

PATCH:	BLOCK 20

PDL:	BLOCK 10
PLEN←←.-PDL

	END START